package com.scexample.exception;

/**
 * @program: merchantbuilddesign
 * @description: 自定义业务异常
 * @author: 少男
 * @create: 2021-02-26 14:41
 **/
public class BusinessException extends BaseException {

    public static final String ERR_DEF="DE001";

    /**
     * 传入code 和Msg 构建BusinessException对象
     * @param code
     * @param msg
     */
    public BusinessException(String code, String msg) {
        super(code,msg);
    }

    /***
     * 提供一个简便的构建BusinessException对象方法
     * @param patterm  异常信息模板 如 xxxx {} xxxx
     * @param args  传入模板所需要的参数
     * @return
     */
    public static BusinessException getInstance(String patterm, Object... args) {
        String msg = java.text.MessageFormat.format(patterm,args);
        return new BusinessException(ERR_DEF,msg);
    }

    /***
     * 提供一个简便的构建BusinessException带Exception的对象方法
     * @param e    异常参数
     * @param patterm  异常信息模板 如 xxxx {} xxxx
     * @param args 传入模板所需要的参数
     * @return
     */
    public static BusinessException getInstance(Throwable e,String patterm, Object... args) {
        String msg = java.text.MessageFormat.format(patterm,args);
        return new BusinessException(ERR_DEF,msg,e);
    }

    public BusinessException(String code, String msg,Throwable e) {
        super(code,msg,e);
    }
    public BusinessException(Throwable e,String msg) {
        super(ERR_DEF,msg,e);
    }
    public BusinessException(Throwable e,String msg,Object... objects) {

        super(ERR_DEF,msg,e);
    }

    /**
     * 判断是否是业务异常
     * @param t
     * @return true: 是业务异常  false:非业务异常
     */
    public static boolean isBusinessException(Throwable t){
        return t == null ? false : (BusinessException.class.isAssignableFrom(t.getClass()) || isDubboBusinessException(t));
    }

    /**
     * 判断是否是dubbo包装过的业务异常，此是dubbo框架内部决定：
     * --如果服务方抛出异常，如果此异常是在接口类所在jar包中定义的，则直接抛出；
     * --否则dubbo会把抛出的异常打包成RuntimeException然后再抛出；
     * @param t
     * @return
     */
    private static boolean isDubboBusinessException(Throwable t){
        return RuntimeException.class.isAssignableFrom(t.getClass()) && t.getMessage() != null && t.getMessage().startsWith("com.scexample.exception.BusinessException");
    }
}
